from pydantic_settings import BaseSettings
from pydantic import ConfigDict
from typing import Optional
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

class Settings(BaseSettings):
    """应用配置类"""
    
    model_config = ConfigDict(
        env_file=".env",
        env_file_encoding="utf-8",
        case_sensitive=False,
        extra="ignore"  # 忽略额外字段
    )
    
    # 应用基本信息
    app_name: str = "CineMind AI"
    app_version: str = "1.0.0"
    debug: bool = False
    
    # 服务器配置
    host: str = "0.0.0.0"
    port: int = 8000
    
    # 数据库配置
    database_url: str = "mysql+pymysql://root:123456@154.8.156.85:3306/cinemind_ai"
    database_echo: bool = False
    
    # JWT配置
    secret_key: str = "your-super-secret-key-change-this-in-production"
    algorithm: str = "HS256"
    access_token_expire_minutes: int = 1440
    
    # 外部API配置
    deepseek_api_key: Optional[str] = None
    deepseek_model: str = "deepseek-chat"
    deepseek_reasoner_model: str = "deepseek-reasoner"
    deepseek_base_url: str = "https://api.deepseek.com/v1"
    deepseek_chat_config: dict = {
        "temperature": 0.7,
        "max_tokens": 1024,
        "request_timeout": 60,  # 延长超时时间以支持意图分析
        "max_history_messages": 10,
        "max_agent_iterations": 3
    }
    deepseek_reasoner_config: dict = {
        "temperature": 0.7,
        "max_tokens": 2048,
        "request_timeout": 120,  # 延长超时时间以支持复杂推理
        "max_history_messages": 10,
        "max_agent_iterations": 3
    }
    # 意图分类配置
    intent_classification_config: dict = {
        "temperature": 0.1,  # 低温度确保分类结果稳定
        "max_tokens": 50,    # 只需要返回类型名称
        "request_timeout": 30
    }
    deepseek_system_prompts: dict = {
    "default": "你是一个智能影视推荐的AI助手。请根据对话历史和用户问题提供准确、有用的回答，如果用户问题是关于电影、电视剧、游戏、音乐等影视内容的，你需要根据用户问题检索相关的影视内容。",
    "personalized": "你是CineMind AI，一个专业的个性化影视推荐助手。你的任务是基于用户的个人信息、偏好设置和情感状态，为用户推荐最适合的影片。\n\n请根据以下用户画像信息进行个性化推荐：\n\n用户基本信息：\n{user_basic_info}\n\n用户偏好设置：\n{user_preferences}\n\n用户情感偏好：\n{user_emotional_preferences}\n\n观影历史：\n{viewing_history}\n\n请结合用户的个人特征、当前情感状态和历史偏好，提供精准的影视推荐。在推荐时请考虑：\n1. 用户的年龄、性别等基本信息\n2. 用户喜欢的电影类型、导演、演员\n3. 用户当前的情感状态和心情\n4. 用户的观影历史和评分记录\n5. 推荐理由要具体且个性化\n\n请用温暖、专业的语调回答，让用户感受到个性化服务的贴心。",
    "movie_recommendation": "你是CineMind AI的专业影片推荐专家。你的任务是根据用户的情感需求和偏好，智能推荐最适合的影片。\n\n在推荐时请：\n1. 深入理解用户当前的情感状态和心理需求\n2. 根据用户描述的心情、场景或需求推荐合适的影片\n3. 提供详细的推荐理由，说明为什么这些影片适合用户当前的状态\n4. 包含影片的基本信息（类型、年份、导演、主演等）\n5. 如果可能，提供多个选择以满足不同偏好\n\n请用专业而温暖的语调，让用户感受到贴心的服务。",
    "movie_analysis": "你是CineMind AI的专业影片分析师。你的任务是对用户询问的影片进行深度分析，并提供观看建议。\n\n在分析时请包含：\n1. 影片的核心主题和艺术价值\n2. 导演风格和拍摄技法分析\n3. 演员表现和角色塑造\n4. 剧情结构和叙事特点\n5. 适合观看的人群和场景\n6. 推荐理由或避雷提醒\n7. 与同类型影片的比较\n\n请提供客观、专业的分析，帮助用户做出观影决策。",
    "plot_explanation": "你是CineMind AI的剧情讲解专家。你的任务是为用户详细讲解影片的剧情内容，并回答相关问题。\n\n在讲解时请：\n1. 按照时间线清晰地梳理剧情发展\n2. 解释复杂的情节转折和隐喻含义\n3. 分析主要角色的动机和成长轨迹\n4. 解读影片的深层主题和寓意\n5. 回答用户对具体情节的疑问\n6. 避免剧透，除非用户明确要求\n\n请用生动有趣的方式讲解，让用户更好地理解和欣赏影片。",
    "movie_qa": "你是CineMind AI的影片问答专家。你的任务是回答用户关于特定影片的各种问题。\n\n请根据问题类型提供：\n1. 影片基本信息（演员、导演、制作信息等）\n2. 剧情细节和情节解释\n3. 角色分析和演员表现\n4. 制作背景和花絮信息\n5. 影片评价和口碑分析\n6. 相关推荐和延伸内容\n\n请确保回答准确、详细，并根据用户的具体问题调整回答的深度和角度。",
    "intent_classification": "你是一个意图分类专家。请分析用户的问题，判断属于以下哪种类型，并只返回对应的类型名称：\n\n1. movie_recommendation - 用户寻求影片推荐（如：心情不好想看电影、推荐一些搞笑电影等）\n2. movie_analysis - 用户询问特定影片的分析和评价（如：这部电影怎么样、值得看吗等）\n3. plot_explanation - 用户需要剧情讲解（如：这部电影讲的什么、剧情是怎样的等）\n4. movie_qa - 用户询问影片的具体信息（如：这部电影的演员是谁、什么时候上映的等）\n5. general_chat - 普通对话，不涉及影视内容\n\n请只返回类型名称，不要添加任何解释。",
    "error_fallback": "抱歉，我在处理您的请求时遇到了一些问题。请稍后再试或重新表述您的问题。"
    }
    
    tavily_api_key: Optional[str] = None
    tavily_base_url: str = "https://api.tavily.com/search"
    
    tmdb_api_key: Optional[str] = None
    tmdb_access_token: Optional[str] = None
    tmdb_base_url: str = "https://api.themoviedb.org/3"
    tmdb_image_base_url: str = "https://image.tmdb.org/t/p"
    tmdb_language: str = "zh-CN"

    maoyan_api_base_url: str = "https://m.maoyan.com"
    maoyan_api_timeout: int = 10
    
    # CORS配置
    cors_origins: list = [
        "http://localhost:3000",
        "http://127.0.0.1:3000",
        "http://localhost:8080",
        "http://127.0.0.1:8080"
    ]
    
    # 日志配置
    log_level: str = "INFO"
    log_file: str = "logs/cinemind.log"
    
    # 缓存配置
    redis_url: Optional[str] = None
    cache_expire_seconds: int = 3600
    
    # 文件上传配置
    upload_dir: str = "uploads"
    max_file_size: int = 10 * 1024 * 1024  # 10MB
    
    # 分页配置
    default_page_size: int = 20
    max_page_size: int = 100
    
    # 添加一些常用的额外配置字段
    version: Optional[str] = None
    allowed_hosts: Optional[str] = None
    
    @property
    def cors_origins_list(self) -> list:
        """将CORS origins转换为列表"""
        if hasattr(self, 'allowed_hosts') and self.allowed_hosts:
            return [origin.strip() for origin in self.allowed_hosts.split(',')]
        return self.cors_origins

# 创建全局设置实例
settings = Settings()

# 确保必要的目录存在
os.makedirs(os.path.dirname(settings.log_file), exist_ok=True)
os.makedirs(settings.upload_dir, exist_ok=True)